#include <iostream>
#include "Juego.h"

using namespace std;

Juego::Juego(){}


Juego::Juego(const unsigned short cantJugadas, const Color* adivinar){
    _cantJugadas = cantJugadas;
    _jugadasRestantes = cantJugadas;
    _aAdivinar[0] = adivinar[0];
    _aAdivinar[1] = adivinar[1];
    _aAdivinar[2] = adivinar[2];
    _aAdivinar[3] = adivinar[3];
    _ganaste = false;
    _aciertos = 0;
    _cercanos = 0;
}


void Juego::crear(const unsigned short cantJugadas, const Color* adivinar){
    _cantJugadas = cantJugadas;
    _jugadasRestantes = cantJugadas;
    _aAdivinar[0] = adivinar[0];
    _aAdivinar[1] = adivinar[1];
    _aAdivinar[2] = adivinar[2];
    _aAdivinar[3] = adivinar[3];
    _ganaste = false;
    _aciertos = 0;
    _cercanos = 0;
}

void Juego::jugar(){

    Color jugada[4];

    while(!termino()){

        cout << endl << "Ingrese 4 numeros separados por un espacio (ej: 1 2 3 4). Cada numero debe estar entre 0 y 7." << endl;
        cin >> jugada[0];
        cin >> jugada[1];
        cin >> jugada[2];
        cin >> jugada[3];

        ingresarJugada(jugada);

        //esto se saca!
        mostrar();

    }

}

void Juego::ingresarJugada(const Color* jugada){

    if(!termino()){
        unsigned short aciertos = 0, cercanos = 0;

        for(int i=0;i<4;i++){
            //me fijo si acertó el i-esimo color
            if(jugada[i] == _aAdivinar[i])
                aciertos++;
            else{
                for(int j=0;j<4;j++){
                    //si no acertó la jugada j y j != i, me fijo si le pasó cerca y sumo un cercano
                    if( (j != i) && (jugada[j] != _aAdivinar[j]) &&  (jugada[i] == _aAdivinar[j]) ){
                            cercanos++;
                            j = 4;
                    }
                }
            }
        }

        _aciertos = aciertos;
        _cercanos = cercanos;
        _jugadasRestantes--;

        if(aciertos == 4){
            _ganaste = true;
            _jugadasRestantes = 0;
        }
    }

}

bool Juego::termino(){
    return (_jugadasRestantes == 0);
}

bool Juego::gano(){
    return _ganaste;
}

void Juego::mostrar(){

    cout    << "Juego actual" << endl
            << "Jugadas Restantes: " << _jugadasRestantes << endl
            << "Respuesta: "    << _aAdivinar[0] << " "
                                << _aAdivinar[1] << " "
                                << _aAdivinar[2] << " "
                                << _aAdivinar[3] << " " << endl
            << "Aciertos: " << _aciertos << endl
            << "Cercanos: " << _cercanos << endl
            << "Ganaste: "  << _ganaste;

}
